package edu.utn.tacs.grupouno.hibernateconfiguration;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.classic.Session;

import edu.utn.tacs.grupouno.negocio.Analisis;
import edu.utn.tacs.grupouno.negocio.AnalisisTipo;
import edu.utn.tacs.grupouno.negocio.ColorValorReferencia;
import edu.utn.tacs.grupouno.negocio.Estudio;
import edu.utn.tacs.grupouno.negocio.Indicador;
import edu.utn.tacs.grupouno.negocio.Medico;
import edu.utn.tacs.grupouno.negocio.Paciente;
import edu.utn.tacs.grupouno.negocio.RangoValorReferencia;
import edu.utn.tacs.grupouno.negocio.Resultado;
import edu.utn.tacs.grupouno.negocio.ResultadoColor;
import edu.utn.tacs.grupouno.negocio.ResultadoNumerico;
import edu.utn.tacs.grupouno.negocio.ValorDeReferencia;

public final class HibernateProvider {

	private ThreadLocal<Session> threadLocal= new ThreadLocal<Session>();
    private SessionFactory sessionFactory;
    private AnnotationConfiguration configuration;
    private static HibernateProvider hibernateProvider;

    private HibernateProvider() {
        configuration = new AnnotationConfiguration();
        
		Class[] classes = {
			Analisis.class,
			AnalisisTipo.class,
			Estudio.class,
			Indicador.class,
			Medico.class,
			Paciente.class,
			Resultado.class,
			ResultadoNumerico.class,
			ResultadoColor.class,
			ValorDeReferencia.class,
			ColorValorReferencia.class,
			RangoValorReferencia.class,
		};
        for(Class clazz : classes) {
        	configuration.addAnnotatedClass(clazz);
        }
		sessionFactory= configuration.buildSessionFactory();
    }

    public static HibernateProvider getInstance(){
    	if(hibernateProvider == null){
    		hibernateProvider = new HibernateProvider();
    	}

    	return hibernateProvider;
    }

    public void registerPersistentPackage(String pack) {
        configuration.addPackage(pack);
    }

    public void flush() {
		getCurrentSession().flush();
	}

	public void beginTransaction() {
		getCurrentSession().beginTransaction();
	}

	public void commit() {
		getCurrentSession().flush();
		getCurrentSession().getTransaction().commit();
	}

	public void rollback() {
		getCurrentSession().getTransaction().rollback();
	}

	public void close() {
		Session session = getCurrentSession();
		if(session != null) {
			session.close();
			threadLocal.set(null);
		}
	}
	
	public void openSession() {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		threadLocal.set(session);
	}

	public Session getCurrentSession() {
		return threadLocal.get();
	}
}